BOJ_7569_토마토

3차원 배열을 탐색하는 너비 우선 탐색(BFS)문제
풀긴 했지만 3차원 배열에 맞게 탐색을 dx, dy, dz로 주는 것이 좋았을 것이다

dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, -1, 1, 0, 0]
dz = [0, 0, 0, 0, -1, 1]

처음 입력을 받을 때 -1이 아닌 토마토의 개수를 모두 세었고, bfs 탐색 중에 개수가 0이 되면 return을 했다

이미 익은 토마토를 입력 받고, 전체를 queue에 넣어서 bfs를 돌렸다
`

from collections import deque  
  
import copy  
  
dx = [-1, 1, 0, 0]  
dy = [0, 0, -1, 1]  
M, N, H = list(map(int, input().split()))  
  
red_tomato = []  
count = 0  
  
tomato = []  
for k in range(H):  
    box = []  
    for i in range(N):  
        arr = list(map(int, input().split()))  
        line = []  
        for j in range(M):  
            line.append(arr[j])  
  
            if arr[j] == 1:  
                red_tomato.append((k, i, j))  
  
            elif arr[j] == 0:  
                count += 1  
  
        box.append(line)  
    tomato.append(box)  
  
  
def bfs(tomato_box, red_tomato_position, tomato_cnt):  
    day = 0  
    queue = deque()  
    queue.extend(red_tomato_position)  
    term = len(queue)  
  
    while queue:  
        if term == 0:  
            term = len(queue)  
            day += 1  
  
        t = queue.popleft()  
  
        # 사방  
        for i in range(4):  
            nx = t[1] + dx[i]  
            ny = t[2] + dy[i]  
  
            if nx < 0 or nx >= N or ny < 0 or ny >= M or tomato_box[t[0]][nx][ny] != 0:  
                continue  
  
            tomato_box[t[0]][nx][ny] = 1  
            tomato_cnt -= 1  
  
            if tomato_cnt == 0:  
                return day + 1  
  
            queue.append((t[0], nx, ny))  
  
        for i in range(-1, 2, 2):  
            nh = t[0] + i  
  
            if nh < 0 or nh >= H or tomato_box[nh][t[1]][t[2]] != 0:  
                continue  
  
            tomato_box[nh][t[1]][t[2]] = 1  
            tomato_cnt -= 1  
  
            if tomato_cnt == 0:  
                return day + 1  
  
            queue.append((nh, t[1], t[2]))  
  
        term -= 1  
  
    return -1  
  
  
if count == 0:  
    print(0)  
else:  
    day = bfs(tomato, red_tomato, count)  
    print(day)